home *** CD-ROM | disk | FTP | other *** search
- /* diskedit.c - low level disk sector viewer/editor */
- /* lrs - 2/13/89 */
-
- #include <stdio.h>
- #include <bios.h>
- #include <dos.h>
- #include "disks.h"
- #include "video.h"
- #include "keys.h"
- #include "devideo.h"
- #include "defiles.h"
-
- #define FALSE 0
- #define TRUE ~FALSE
-
- char WriteAllowed = FALSE;
- int Drive = 0x80;
- int HalfDisp = TRUE; int DispOffs = 0;
-
- int Cyl = 0; int Head = 0; int Sec = 1;
- int MaxCyl, MaxHead, MaxSec;
- extern int scrrows;
- char Done;
- unsigned char SecBuf[BYTESPERSECTOR];
-
- /*-----------------------------------------------------------------------*/
- void limit (int* num, int lowest, int highest)
- {
- if (*num < lowest) *num = lowest;
- if (*num > highest) *num = highest;
- }
- /*-----------------------------------------------------------------------*/
- void ReadCurrent(void)
- {
- if (!ReadSector(Drive, Cyl, Head, Sec, (char far *) SecBuf))
- {
- ErrorMessage("READ ERROR!!!!");
- WriteAllowed = FALSE;
- ShowWriteAllowed(WriteAllowed);
- }
- } /* ReadCurrent */
-
- void WriteCurrent(void)
- {
- if (!WriteAllowed)
- ErrorMessage("Sector Updates Not Allowed! (use alt+F10 to enable)");
- else
- if (getkey("Are You Sure? ") == 'Y')
- if (!WriteSector(Drive, Cyl, Head, Sec, (char far *) SecBuf))
- ErrorMessage("WRITE ERROR!!!!");
- else
- ErrorMessage("Write Successful");
- } /* WriteCurrent */
-
- /*-----------------------------------------------------------------------*/
- void NextSector(void)
- {
- if ((DispOffs == 0) && (HalfDisp))
- DispOffs = 16;
- else
- {
- DispOffs = 0;
- if (++Sec > MaxSec)
- {
- Sec = 1;
- if (++Head > MaxHead)
- {
- Head = 0;
- if (++Cyl > MaxCyl)
- Cyl = 0;
- }
- }
- ReadCurrent();
- }
- DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
- } /* NextSector */
-
- void PrevSector(void)
- {
- if ((DispOffs != 0) && (HalfDisp))
- DispOffs = 0;
- else
- {
- if (HalfDisp) DispOffs = 16;
- if (--Sec < 1)
- {
- Sec = MaxSec;
- if (--Head < 0)
- {
- Head = MaxHead;
- if (--Cyl < 0)
- Cyl = MaxCyl;
- }
- }
- ReadCurrent();
- }
- DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
- } /* PrevSector */
-
- void GotoSector(void)
- {
- getdec("Cylinder:",&Cyl); limit(&Cyl,0,MaxCyl);
- getdec("Head:",&Head); limit(&Head,0,MaxHead);
- getdec("Sector:",&Sec); limit(&Sec,1,MaxSec);
- ReadCurrent();
- DispOffs = 0;
- DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
- } /* GotoSector */
-
- /*-----------------------------------------------------------------------*/
- void ReadSectorFromFile(void)
- {
- char filename[80];
- getline("Read from File:",filename);
- ReadFile(filename, SecBuf);
- DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
- } /* ReadSectorFromFile */
-
- void WriteSectorToFile(void)
- {
- char filename[80];
- getline("Write To File:",filename);
- WriteFile(filename, SecBuf);
- } /* WriteSectorToFile */
-
- /*-----------------------------------------------------------------------*/
- void ModifyByte(void)
- {
- int address, val;
- address = 0;
- gethex("Modify Byte at:",&address);
- limit(&address,0,BYTESPERSECTOR-1);
- val = SecBuf[address];
- gethex("New Value:",&val);
- SecBuf[address] = val;
- ErrorMessage("Don't Forget to Update!");
- DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
- } /* ModifyByte */
- /*-----------------------------------------------------------------------*/
- void DoCommand(void)
- {
- int ch;
-
- ch = getcmd();
- ClearErrorMessage();
- switch (ch)
- {
- case PGDN: NextSector(); break;
- case PGUP: PrevSector(); break;
- case 'G': GotoSector(); break;
- case 'W': WriteSectorToFile(); break;
- case 'R': ReadSectorFromFile(); break;
- case 'M': ModifyByte(); break;
- case F10: WriteCurrent(); break;
- case aF10: WriteAllowed = !WriteAllowed;
- ShowWriteAllowed(WriteAllowed);
- break;
- case ESC: Done = TRUE;
- break;
- }
- } /* DoCommand */
-
- /*-----------------------------------------------------------------------*/
- void SelectDrive(int drive)
- {
- InitDisks();
- GetDiskParams(Drive, &MaxCyl, &MaxHead, &MaxSec);
- ShowMaxes(MaxCyl, MaxHead, MaxSec);
- }
-
- /*-----------------------------------------------------------------------*/
- void main()
- {
- initvideo(); cursoroff();
- scrrows = screenrows(); HalfDisp = (scrrows < 43);
- DisplayFrame();
- SelectDrive(0x80);
- ReadCurrent();
- DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
- Done = FALSE;
- while (!Done)
- DoCommand();
-
- clearscreen(); cursoron();
- cprintf("diskedit is finished.");
- }
- /*---- end of diskedit.c ----*/
-